package com.xiyou.leetcode.offer;

import java.util.Stack;

/**
 *
 输入一个链表的头节点，从尾到头反过来返回每个节点的值（用数组返回）。

 示例 1：
 输入：head = [1,3,2]
 输出：[2,3,1]

 限制：
 0 <= 链表长度 <= 10000
 */
public class ReversePrint {
    public int[] reversePrint(ListNode head) {
        // 这里我们其实也可以定义一个列表，用来进行倒序遍历，但是这个太普通了 我们整高难度的
        // 定义个栈Stack 先入后出
        Stack<Integer> stack = new Stack<>();
        // 循环遍历链表
        while (head != null) {
            stack.push(head.val);
            // 下一个节点
            head = head.next;
        }
        // 栈的长度
        // 这里一定要在外面定义，因为如果再循环中定义，使用pop操作，栈的长度是随时会变的。
        int size = stack.size();
        // 此时已经完成入栈操作，定义一个数组用来存储就行
        int[] resultArry = new int[size];
        // 遍历栈，利用其先入后出的原则进行出栈
        for (int i = 0; i < size; i++) {
            // 出栈操作 并且将其从栈中移除
            // peek操作也是栈顶出栈，但是不会从栈中移除
            resultArry[i] = stack.pop();
        }
        return resultArry;
    }

    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode head1 = new ListNode(3);
        ListNode head2 = new ListNode(2);
        head.next = head1;
        head1.next = head2;
        new ReversePrint().reversePrint(head);
    }
}

/**
 * 定义链表的元素
 */
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
 }
